import {
	newPaymentOrder,
	h5WxPay,
	appWxPay,
	jsapiPay,
	TreasureToPayWeb,
	TreasureToPayApp,
	theBalancePayment,
	queryWhetherSufficientBalance,
	orderPaymentStatus,
	addUserOrder,
	wxObtainOpenid,
	wxObtainPayJSApi
} from "@/common/api/pay.js"
import {
	getToken,
	setToken
} from './token.js'
import {
	getUserInfo,
	setUserOpenid,
	getUserOpenid, //获取用户唯一ID
	getUserToken
} from "@/utils/storage.js"
// #ifdef H5
let wx = require('jweixin-module'); // 微信JS-SDK  安装方法 npm install jweixin-module --save
import store from '@/store/index.js'
// #endif
let stateOfTheBalance = false //余额状态
//订单新增

const ordersForNew = (params) => {
	return new Promise((resolve, reject) => { //新增订单
		addUserOrder(params).then(res => {
			// if (res.data.code == 1) { //返回正确
			if (res.data.code == 200) {
				resolve(res)
			} else { //失败弹出创建失败信息
				uni.showToast({
					duration: 4000,
					title: "订单创建失败",
					icon: "none"
				}) //返回失败
				reject()
			}
		})
	})
}
//聚合支付
const aggregatePay = ({
	orderParams, //订单参数
	methodOfPayment, //支付方式
	success, //成功
	error //失败
}) => {
	setToken('orderNo', orderParams.out_trade_no)
	if (methodOfPayment.code == 1) { //微信支付
		// #ifdef H5   
		//h5端微信支付
		console.log('h5端微信支付');
		var ua = window.navigator.userAgent.toLowerCase(); //转小写		
		// match方法里面放的是一个正则表达式，表示如果字符串中有MicroMessenger则结果为MicroMessenger，没有则结果为null
		//i:不区分大小写
		if (ua.match(/MicroMessenger/i) == 'micromessenger') {
			// 微信浏览器打开
			// #ifdef H5
			thePublicWeChatPay(orderParams, success, error)
			// #endif
		} else {
			//普通浏览器打开
			paymentProcessing(orderParams)
		}
		//缓存操作状态,用以判断用户是否进行支付操作
		// #endif

		// #ifdef MP-WEIXIN 
		//微信小程序h5微信支付
		smallProgramWeChatPayments(orderParams, success, error)
		// #endif
	}

	if (methodOfPayment.code == 2) { //支付宝支付
		payTreasureToPay(orderParams, success, error)
	}

	if (methodOfPayment.code == 4) { //余额支付
		TheBalancePayment(orderParams, success, error)
	}
}

//普通浏览器h5微信支付
const paymentProcessing = (params) => {
	h5WxPay(params).then(res => {
		if (res.data.code == 1) {
			// #ifdef APP-PLUS
			const platform = uni.getSystemInfoSync().platform //getSystemInfoSync:获取系统信息 同步			

			//如果支付成功 跳转至https://www.ydylmold.cn/
			// 创建一个webview  plus.webview.create( url, id, styles, extras ); 用于加载新的HTML页面，可通过styles设置Webview窗口的样式，创建完成后需要调用show方法才能将Webview窗口显示出来。
			const webview = plus.webview.create('',
				'custom-webview'); //调用webview的loadUrl方法，设置webView要显示的网页 本地文件存放在assets文件中
			webview.loadURL(res.data.msg, {
				'Referer': 'https://job.ydylmold.cn/'
			});
			// 通过webview打开链接，后面加referer表示该链接是从哪里打开的，
			//请填写申请h5支付的域名，比如：http://www.baidu.com,需要已备案
			// #endif			
			// #ifdef H5
			// window.location.href = res.data.msg
			// #endif			
		} else {
			uni.showToast({
				duration: 4000,
				title: res.data.msg,
				icon: "none"
			})
		}
	})
}

//微信浏览器微信支付  H5端微信支付
// #ifdef H5
const thePublicWeChatPay = (orderParams, success, error) => {
	let params = {}
	params['out_trade_no'] = orderParams.out_trade_no //用户订单编号
	params['jAmt'] = orderParams.jAmt
	if (!getUserOpenid()) {
		store.commit("toLogin")
		return;
	}
	params['openId'] = getUserOpenid() //获取用户唯一ID
	getToken('assoId') ? params['entityName'] = getToken('modleName') : params['entityName'] = 'mingpian'

	params['chainTypeId'] = 10016;
	const url = encodeURIComponent(window.location.href.split('#')[0]);
	// ?url=${url}	//发送请求
	uni.request({
		url: `https://job.ydylmold.cn/ydylPay/api/wxPayJSApi`, //仅为示例，并非真实接口地址。
		method: 'POST',
		data: params,
		header: {
			'token': getUserToken(),
			'content-type': 'application/x-www-form-urlencoded' // 默认值
		},
		success: (res) => {
			if (!res.data.code) {
				uni.showToast({
					title: '支付失败',
					icon: 'none'
				})
				return
			}
			let data = res.data.data
			// //jsdk签名验证
			wx.config({
				debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
				appId: data.appId, // 必填，公众号的唯一标识
				timestamp: data.timeStamp, // 必填，生成签名的时间戳
				nonceStr: data.nonceStr, // 必填，生成签名的随机串
				signature: data.signType, // 必填，签名，见附录1
				jsApiList: ['chooseWXPay'] // 必填，需要使用的JS接口列表，所有JS接口列表见附录2
			})

			//签名成功执行支付jsapi
			wx.ready(function() {
				uni.hideLoading() //微信支付
				wx.chooseWXPay({
					timestamp: data
						.timeStamp, // 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
					nonceStr: data.nonceStr, // 支付签名随机串，不长于 32 位
					package: data
						.packages, // 统一支付接口返回的prepay_id参数值，提交格式如：prepay_id=\*\*\*）
					signType: data.signType, // 微信支付V3的传入RSA,微信支付V2的传入格式与V2统一下单的签名格式保持一致
					paySign: data.paySign, // 支付签名
					success: function(res) {
						//console.log(res, '成功支付')
						// 支付成功后的回调函数
						success(res)
					},
					error: function(error) {
						error(error)
						uni.showToast({
							title: '支付失败',
							icon: 'none'
						})
						//console.log(res, '失败支付')
					}
				});
			});
			//签名错误,抛出异常
			wx.error(function(res) {
				uni.hideLoading() //微信支付
				uni.showToast({
					title: '支付失败',
					icon: 'none'
				})
				// config信息验证失败会执行error函数，如签名过期导致验证失败，具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，对于SPA可以在这里更新签名。
			});
		}
	})
}

// #endif
//微信小程序微信支付
const smallProgramWeChatPayments = (orderParams, success, error) => {
	// 获取openid
	wx.login({
		success: res => {
			if (res.code) {
				wxObtainOpenid({
					'code': res.code,
					'appId': 'wxddeb9bc952bc8fcd',
					'chainTypeId': '10016'
				}).then(res => {
					if (res.data && res.data.data != 'null') {
						let data = res.data.data
						let params = {}
						params['out_trade_no'] = orderParams.out_trade_no; //用户订单编号
						params['jAmt'] = orderParams.jAmt;
						params['openId'] = data;
						params['appId'] = 'wxddeb9bc952bc8fcd';
						params['chainTypeId'] = '10016';
						wxObtainPayJSApi(params).then(res2 => {
							let pay = res2.data && res2.data.data
							uni.requestPayment({
								provider: 'wxpay',
								timeStamp: pay.timeStamp,
								nonceStr: pay.nonceStr,
								package: pay.packages,
								signType: pay.signType,
								paySign: pay.paySign,
								success: function(res) {
									//console.log('success:' + JSON.stringify(res));
									success(res)
								},
								fail: function(err) {
									//console.log('fail:' + JSON.stringify(err));
									error(error)
								}
							});
						}).catch(err => {
							uni.showToast({
								title: '支付失败！',
								icon: 'none'
							})
						})
					}
				}).catch(err => {
					uni.showToast({
						title: '支付失败！',
						icon: 'none'
					})
				})
			}
		},
		fail: (err) => {
			//console.log(err, '小程序微信支付出错')
		}
	})


}

//支付宝支付
const payTreasureToPay = (orderParams, success, error) => {
	//orderParams:订单信息
	// #ifdef H5
	TreasureToPayWeb(orderParams).then(res => { //支付宝web支付发送请求
		if (res.data.code == 1) {
			//将接口返回的Form表单显示到页面			//获取页面元素
			document.querySelector('body').innerHTML = res.data.msg;
			//调用submit 方法
			document.forms[0].submit()
		} else {
			uni.showToast({
				duration: 4000,
				title: res.data.mesg,
				icon: "none"
			})
		}
	})

	// #endif
	// #ifdef APP-PLUS
	TreasureToPayApp(orderParams).then(res => {
		if (res.data.code == 1) {
			uni.requestPayment({
				provider: 'alipay',
				orderInfo: res.data.msg, //微信、支付宝订单数据 【注意微信的订单信息，键值应该全部是小写，不能采用驼峰命名】
				success: function(res) {
					success()
				},

				fail: function(err) {
					error()
				}
			});

		} else {
			uni.showToast({
				duration: 4000,
				title: res.data.msg,
				icon: "none"
			})
		}
	})
	// #endif
}

//余额支付
const TheBalancePayment = async (orderParams, success, error) => {
	let params = {}
	getToken('version') == 1 ? params['usrNo'] = getToken('useNum') : params['companyNo'] = getToken('useNum')
	params['usrAmt'] = orderParams.jAmt
	queryWhetherSufficientBalance(params).then(res => { //查询余额是否充足
		if (res.data.code == 1) {
			let orderData = {}
			orderData['payOrderNo'] = orderParams.out_trade_no
			orderData['usrAmt'] = orderParams.jAmt
			getToken('version') == 1 ? orderData['usrNo'] = getToken('useNum') : orderData[
				'companyNo'] = getToken('useNum')
			orderData['entityName'] = 'job'
			theBalancePayment(orderData).then(res => {
				if (res.data.code == 1) {
					success()
				} else {
					error()
				}
			})
		} else {
			uni.showToast({
				title: "余额不足",
				mask: true,
				icon: "none"
			})
		}
	})
}

//查询订单支付状态
const getOrderPaymentStatus = ({
	success,
	error
}) => {
	let params = {}
	if (getToken('version') == 1) {
		params['craftsmanId'] = getToken('useNum');
	} else {
		params['companyNo'] = getToken('useNum');
	}
	params['entityType'] = 1;
	orderPaymentStatus(params).then(res => {
		if (res.data.code == 1) {
			uni.showModal({
				title: '提示',
				content: '购买成功！',
				showCancel: false
			})
			setToken('orderNo', null)
			success(res)
		} else {
			uni.showToast({
				mask: true,
				icon: "none",
				title: res.data.msg
			})
			setToken('orderNo', null)
			error(res)
		}
	})
}
export const pay = {
	ordersForNew,
	aggregatePay,
	getOrderPaymentStatus
}